package com.example.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.example.mapper.BlogInfoMapper;
import com.example.model.AddBlogInfoParam;
import com.example.model.BlogInfo;
import com.example.model.BlogInfoResponse;
import com.example.model.UpBlogParam;
import com.example.service.BlogService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: bjc
 * Date: 2025-07-31
 * Time: 21:47
 */
@Service
public class BlogServiceImpl implements BlogService {
    @Autowired
    private BlogInfoMapper blogInfoMapper;

    /**
     * 获取博客列表
     * @return
     */
    @Override
    public List<BlogInfoResponse> getList() {
        //使用mybatisplus的lambda表达式实现从数据库中查询数据
        //1.创建查询条件
        LambdaQueryWrapper<BlogInfo> queryWrapper = new LambdaQueryWrapper<>();
        //2.设置条件,删除标志为0表示数据没有删除；按照id降序排序，是为了实现最新的数据在前
        queryWrapper.eq(BlogInfo::getDeleteFlag,0).orderByDesc(BlogInfo::getId);
        //3.执行查询
        List<BlogInfo> blogInfoList = blogInfoMapper.selectList(queryWrapper);
        //4.将查询结果转换成响应对象
        List<BlogInfoResponse> blogInfoResponseList = blogInfoList.stream().map(blogInfo -> {
            BlogInfoResponse blogInfoResponse = new BlogInfoResponse();
            BeanUtils.copyProperties(blogInfo,blogInfoResponse);
            return blogInfoResponse;
        }).collect(Collectors.toList());
        return blogInfoResponseList;
    }

    /**
     * 获取博客详情
     * @param blogId
     * @return
     */
    @Override
    public BlogInfoResponse getBlogDetail(Integer blogId) {
        //1.创建查询条件
        LambdaQueryWrapper<BlogInfo> queryWrapper = new LambdaQueryWrapper<>();
        //2.设置查询条件
        queryWrapper.eq(BlogInfo::getDeleteFlag,0).eq(BlogInfo::getId,blogId);
        //3.查询
        BlogInfo blogInfo = blogInfoMapper.selectOne(queryWrapper);//selectOne表示查询单条数据
        //4.将查询结果转换成响应对象
        //因为用了selectOne，所以查询结果是一个对象，而不是一个集合，所以不能用 stream
        BlogInfoResponse blogInfoResponse = new BlogInfoResponse();
        BeanUtils.copyProperties(blogInfo,blogInfoResponse);
        return blogInfoResponse;
    }

    /**
     * 添加博客
     * @param addBlogInfoParam
     * @return
     */
    @Override
    public Boolean addBlog(AddBlogInfoParam addBlogInfoParam) {
        BlogInfo blogInfo = new BlogInfo();
        BeanUtils.copyProperties(addBlogInfoParam,blogInfo);
        //设置创建时间和更新时间
        Date date = new Date();
        blogInfo.setCreateTime(date);
        blogInfo.setUpdateTime(date);
        // 设置删除标志为0（未删除）
        blogInfo.setDeleteFlag(0);
        // 执行插入操作
        int result = blogInfoMapper.insert(blogInfo);
        // 返回是否插入成功
        return result > 0;
    }

    /**
     * 修改博客
     * @param upBlogParam
     * @return
     */
    @Override
    public Boolean updateBlog(UpBlogParam upBlogParam) {
        BlogInfo blogInfo = new BlogInfo();
        BeanUtils.copyProperties(upBlogParam,blogInfo);
        //设置更新时间
        blogInfo.setUpdateTime(new Date());
        int result = blogInfoMapper.updateById(blogInfo);
        return result > 0;
    }

    /**
     * 删除博客,实际上是逻辑删除，也就是修改删除标志为1
     * @param blogId
     * @return
     */
    @Override
    public Boolean deleteBlog(Integer blogId) {
        //使用mybatisplus的deleteById方法实现逻辑删除
        int result = blogInfoMapper.deleteById(blogId);
        return result > 0;
    }
}
